package in.lib.handler.base;
import in.lib.Constants;
import in.lib.Debug;
import in.lib.writer.MultiFileCacheWriter;
import in.model.Post;
import in.model.base.NetObject;
import in.obj.StreamMarker;
import in.rob.client.page.base.PostStreamFragment;
import java.util.ArrayList;
import lombok.Getter;
import lombok.Setter;
import android.content.Context;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
/**
* Standard response handler for Post streams.
*
* Use {@link #getPosts()} in {@link #onCallback()} to get the returned posts
*/
public abstract class PostStreamResponseHandler extends StreamResponseHandler<PostStreamFragment>
{
@Getter @Setter private int newPostCount = 0;
public PostStreamResponseHandler(Context c, boolean append)
{
super(c, append);
}
@Override public void onSuccess()
{
JsonElement elements = getContent();
if (elements != null)
{
MultiFileCacheWriter cacheWriter = new MultiFileCacheWriter();
try
{
JsonArray jPosts = elements.getAsJsonObject().get("data").getAsJsonArray();
int size = jPosts.size();
setObjects(new ArrayList<NetObject>(size));
for (int index = 0; index < size; index++)
{
JsonObject post = jPosts.get(index).getAsJsonObject();
Post p = new Post().createFrom(post);
// something wrong happened (maybe a deletion)
if (p == null) continue;
getObjects().add(p);
cacheWriter.scheduleAsyncWrite(String.format(Constants.CACHE_USER, p.getPoster().getId()), p.getPoster());
}
if (elements.getAsJsonObject().has("meta"))
{
JsonObject meta = elements.getAsJsonObject().get("meta").getAsJsonObject();
if (meta.has("max_id"))
{
setFirstId(meta.get("max_id").getAsString());
}
else if (getObjects().size() > 0)
{
setFirstId(getObjects().get(0).getId());
}
if (meta.has("min_id"))
{
setLastId(meta.get("min_id").getAsString());
}
else if (getObjects().size() > 0)
{
setLastId(getObjects().get(getObjects().size() - 1).getId());
}
if (meta.has("more"))
{
setHasMore(meta.get("more").getAsBoolean());
}
setMarker(StreamMarker.fromObject(meta));
}
cacheWriter.executeAsyncWriteList();
onCallback();
}
catch (Exception e)
{
Debug.out(getConnectionInfo());
Debug.out(e);
setDidFail(true);
}
}
else
{
setDidFail(true);
}
}
}